package ru.mirent;

import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.SourceStringReader;
import net.sourceforge.plantuml.core.DiagramDescription;
import ru.mirent.entity.TypeDiagram;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import static java.util.Objects.isNull;

public class PngTypeDiagram extends TypeDiagram {
    /**
     * Класс генерации и сохранения диаграмм в формате: png.
     */
    public PngTypeDiagram(String sourceCodeDiagram) {
        super(sourceCodeDiagram);
    }

    /**
     * Сохранить диаграмму в файле.
     * @param file путь к файлу для сохранения
     */
    public void saveToFile(File file) {
        try {
            SourceStringReader reader = new SourceStringReader(getSourceCodeDiagram());
            ByteArrayOutputStream os = new ByteArrayOutputStream();

            DiagramDescription desc = reader.outputImage(os, new FileFormatOption(FileFormat.PNG));

            if (isNull(desc)) {
                throw new RuntimeException("Ошибка генерации диаграммы");
            }

            FileOutputStream fos = new FileOutputStream(file);
            os.writeTo(fos);
            os.close();
        } catch (IOException exception) {
            // TODO Сделать корректную обработку ошибки для всех бросаемых исключений
            throw new RuntimeException("Ошибка генерации диаграммы");
        }
    }

    /**
     * Сохранение вложения для Allure-отчета не реализовано, т.к. меньше качество и больше объем.
     * @param attachmentName имя вложения
     */
    public void attachDiagramToAllure(String attachmentName) {
        throw new RuntimeException("Сохранение диаграммы в виде PNG файла не реализовано");
    }
}
